复合模式 Compound Pattern

在形式上,复合模式确实是多个模式的组合,但满足了这一条并不一定是复合模式,注意它的定义:将多个模式结合起来形成一个“框架”,以解决一般性问题,一提到“框架”,可能最容易联想到的就是MVC吧,不过MVC确实是一个经典的复合模式。

MVC与复合模式

Model,View,Controller各自的职责:

这里不得不强调一下控制逻辑与应用逻辑(算法逻辑)的区别:
所谓控制逻辑,就是判断在当前情景下应该调用什么对象的什么方法
而应用逻辑指的是具体对象的具体方法的内部实现(某个复杂的算法,或者一系列的具体处理)
(非要细说的话,View里面其实也包含了一点控制逻辑(根据用户动作判断应该调用哪一个Controller),当然,一般情况我们都把这点逻辑忽略不计的)

MVC的最大优点就是把表现层View与模型Model分离,实现了设计上的松耦合(应对变化)以及代码的复用(View可以随便换,只需要改改新View里面那一丁点儿控制逻辑就好了)

前面说过了MVC是一种复合模式,那它到底复合了哪些模式,一起看看:

观察者模式:

模型实现观察者模式,当 Model 的状态改变时,相关对象将持续更。使用观察者模式可以让模型完全独立于视图和控制器,同一个模型可以使用不同的视图,甚至可以同时使用多个视图。

V和C都是M的观察者(Model的状态更新要及时通知V更新视图,或者通知C做相应逻辑处理)

策略模式:

控制器和视图实现策略模式,控制器是视图的行为,视图根据用户的行为不同 委托 不同的控制器处理用户请求,所以说Controller是View的“策略”,所以View包含的控制逻辑就是“选择策略”,也就是选择控制器Controller。

使用策略模式可让视图和模型解耦,因为控制器负责和模型交换来传递用户的请求信息,对于工作是怎么完成的,视图是可以完全不知情的。

组合模式:

View的自身实现应用了组合模式(调用顶层容器的repaint方法,容器内的所有组件都会重绘)

手机显示框内,或者 web 界面,每个显示组件如果不是组合节点(窗口),就是叶节点(按钮),当控制器告诉视图更新时,只需告诉视图最顶层的组件,组合模式会处理其余的事。

MVC应用了多个模式,并能够较好的解决设计上的一般性问题,所以被称为复合模式